package com.good.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import com.page.PageResults;

/**
 *@author ieei
 *baseDao
 */
public interface BaseDao<T, ID extends Serializable> {

	/**
	 * 保存实体
	 * 
	 * @param entity
	 */
	public abstract void save(T entity);

	/**
	 * 保存或者更新实体
	 * 
	 * @param entity
	 */
	public abstract void saveOrUpdate(T entity);

	/**
	 * 根据id查找实体懒加载
	 * 
	 * @param id
	 */
	public abstract T load(ID id);

	/**
	 * 根据id查找实体
	 * 
	 * @param id
	 */
	public abstract T find(ID id);

	/**
	 * <contains>
	 * 判断是否包含实体
	 * @param entity
	 */
	public abstract boolean contains(T entity);

	/**
	 * 删除实体
	 * @param entity
	 */
	public abstract void delete(T entity);

	/**
	 * 根据id删除实体
	 * @param Id
	 */
	public abstract boolean deleteById(ID Id);

	/**
	 * 删除实体集合
	 * 
	 * @param entities
	 */
	public abstract void deleteAll(Collection<T> entities);

	/**
	 * 执行hql语句
	 * @param hqlString
	 *            hql
	 * @param values
	 */
	public abstract void queryHql(String hqlString, Object... values);

	/**
	 * 执行sql语句
	 * @param sqlString
	 *            sql
	 * @param values
	 */
	public abstract void querySql(String sqlString, Object... values);

	/**
	 * 根据hql获取实体
	 * @param hqlString
	 * @param values
	 */
	public abstract T findByHQL(String hqlString, Object... values);

	/**
	 * 根据sql获取实体
	 * @param sqlString
	 * @param values
	 */
	public abstract T findBySQL(String sqlString, Object... values);

	/**
	 * hql获取实体集合
	 * @param hqlString
	 * @param values
	 * @return list
	 */
	public abstract List<T> findListByHQL(String hqlString, Object... values);

	/**
	 * 
	 */
	public abstract List<T> findListBySQL(String sqlString, Object... values);

	/**
	 * <refresh>
	 * 
	 * @param t
	 */
	public abstract void refresh(T t);

	/**
	 * <update>
	 * 
	 * @param t
	 */
	public abstract void update(T t);

	/**
	 * 查找个数
	 * @param hql
	 * @param values
	 * @return 个数
	 */
	public abstract Long findCount(String hql, Object... values);

	/**
     * <HQL分页查询>
     * @param hql HQL语句
     * @param countHql 查询记录条数的HQL语句
     * @param pageNo 下一页
     * @param pageSize 一页总条数
     * @param values 不定Object数组参数
     * @return PageResults的封装类，里面包含了页码的信息以及查询的数据List集合
	 */
	public abstract PageResults<T> findPage(String hql,
			String countHql, int pageNo, int pageSize, Object... values);
}
